import tinymce from 'tinymce/tinymce'
import store from '@/store'
import { menuitems } from './menuitem'
import { getRootNode } from '@/utils/validate.js'
import { editable, getPageSheetNode } from '@/utils/helpers'

function checkSpanNode(node, type = 'keyword') {
  return node.nodeName === 'SPAN' && node.dataset.type === type
}

tinymce.PluginManager.add('pageContextmenu', function (editor) {
  // console.debug('---右键菜单 start---')
  // 注册
  Object.keys(menuitems).forEach(key => menuitems[key](editor))

  // 右键菜单
  editor.ui.registry.addContextMenu('pageContextmenu', {
    update() {
      if (store.getters.entry === 'flow') {
        return getFlowContextmenu(editor)
      }
      // bug 8025引言 8008前言 8001目次 7974更改记录页屏蔽右键菜单
      // 包括：关键词、索引、收藏、更新域
      // 1. 更新域只在索引和引用页面
      const dataset = getPageSheetNode(editor)?.dataset
      if (!dataset) return []
      const pageType = dataset?.contentPageType || dataset?.pageType
      // 2. 关键词、收藏只在可以编辑的页面，除：封面，签署，修改记录，封面，引用文件，索引
      if (['cover', 'signature', 'revision', 'contents'].includes(pageType)) {
        return []
      }
      // 正文页均放开横板竖版
      let res = ['contextmenu_layout_portrait', 'contextmenu_layout_landscape']
      // 如果是新增的空白页，可以设置横向、纵向
      if (pageType === 'blank_page') {
        res = ['contextmenu_layout_portrait', 'contextmenu_layout_landscape', 'contextmenu_blankpage_remove']
      }
      if (pageType === 'annex') {
        res = ['contextmenu_layout_portrait', 'contextmenu_layout_landscape']
      }
      const varibleDom = editor.selection.getNode();
      const data_type = varibleDom.getAttribute('data-type');
      const variableAtt = { dataId: varibleDom.getAttribute('data-id'), dataType: data_type,variableId: varibleDom.getAttribute("data-variable-id") }
      const domParentNode = varibleDom.parentNode;
      //变量替换(仅有字符串可以替换)
      if (data_type && (data_type.includes('variable_string') || data_type.includes('variable_hide_string')) && data_type !== 'variable_string_summary' ) {
        // 缓存变量属性
        store.commit('xmleditor/SET_VARIABLE_ATT', variableAtt)
        res.push('contextmenu_varible_replace');
      }
      // 依据性文件
      if (data_type == 'variable_string_relationFiles') {
        // 缓存变量属性
        store.commit('xmleditor/SET_VARIABLE_ATT', variableAtt)
        res.push('contextmenu_relationFiles');
      }
      const tableNode = getRootNode(domParentNode);
      if (tableNode) {
        const tableDomCach = store.state.xmleditor.tableVariables;
        const tableNodeId = tableNode.getAttribute("data-id");
        let tableType = ""
        tableDomCach.forEach(el => {
          if (el.dataId == tableNodeId) {
            // 材料
            if (el.tableType == 'variable_table_meterial') {
              res.push('contextmenu_material');
            }
            // 条款
            if (el.tableType == 'variable_table_provision') {
              res.push('contextmenu_provision');
            }
            // 紧固件
            if (el.tableType == 'variable_table_fastener') {
              res.push('contextmenu_fastener');
            }
            // 工况
            if (el.tableType == 'variable_table_loadCase') {
              res.push('contextmenu_loadCase');
            }
            // 依据性文件
            // if (el.tableType == "variable_table_relationFiles") {
            //   res.push('contextmenu_relationFiles');
            // }
            tableType = el.tableType;
          }
        })
        store.commit('xmleditor/SET_VARIABLE_TABLE_DATAID', { dataId: tableNode.getAttribute("data-id"), tableType: tableType, variableId: tableNode.getAttribute("data-variable-id") })
      }
      // 条款变量
      // if(data_type==='COMPOSITE'){
      // 缓存变量属性
      // store.commit('xmleditor/SET_VARIABLE_ATT', variableAtt)
      // res.push('contextmenu_provision_replace');
      //  }
      // document | template | block | collect，只有当 document 时才有收藏和关键词
      if (store.getters.editContentType !== 'document') {
        return res
      }
      if (pageType === 'index' || pageType === 'indexEn') {
        if (!editable(dataset)) return []
        return ['contextmenu_domain_update']
      }
      if (pageType === 'normative_references') {
        if (!editable(dataset)) return []
        return ['contextmenu_reference_manage']
      }

      // // 当是术语文档时，后端返回字段
      // if (editable(dataset) && store.getters.isTermDoc && pageType === 'terms_definitions') {
      //   res = ['contextmenu_terms_manage']
      // }
      // 当是缩略语文档时，后端返回字段
      if (editable(dataset) && store.getters.isAbbrDoc && pageType === 'symbols_abbreviation') {
        res = ['contextmenu_abbr_manage']
      }

      const selectionNode = editor.selection.getNode()
      // if (editable(dataset) && checkSpanNode(selectionNode, 'bizIndex')) {
      //   res.push('contextmenu_bizindex_cancle')
      // }
      const isContenteditable = editor.dom.is(selectionNode, '[contenteditable=false]')
      const isNoneditable = editor.dom.is(selectionNode, '.noneditable')
      const content = editor.selection.getContent({ format: 'text' })
      const { startContainer, endContainer } = editor.selection.getRng()
      if (endContainer === startContainer) {
        if (editable(dataset) && checkSpanNode(endContainer.parentNode, 'keyword')) {
          res.push('contextmenu_keyword_cancle')
        }
        // 仅在非列项的内容处设置
        const inItemList = editor.dom.getParent(selectionNode, '[data-type="item_list"]')
        if (inItemList) {
          console.debug('---列项仅支持纯文本,不支持索引和关键词设置---')
        }
        if (editable(dataset) && !inItemList && selectionNode.nodeName !== "SPAN" && endContainer.nodeType === 3 && content) {
          // if (dataset?.contentPageType === 'terms_definitions') {
          //   res.push('contextmenu_bizindex') // 只在正文内容页且只能在术语和定义页面
          // }
          res.push('contextmenu_keyword')
        }
        if (
          (!isContenteditable || !isNoneditable) &&
          (
            editor.dom.getParent(selectionNode, 'div[data-type="figure"]') ||
            editor.dom.getParent(selectionNode, 'div.formula') ||
            editor.dom.getParent(selectionNode, 'table[data-type="table"]')
          )
        ) {
          // 图结构化、公式、表格的收藏
          return [...res, 'contextmenu_collect']
        }
      }
      return [...res, 'contextmenu_collect']
    }
  })

  // console.debug('---右键菜单 end---')

  return {
    getMetadata: function () {
      return {
        name: '页面布局',
        url: 'http://sfrj.cn'
      }
    }
  }
})

/** entry: flow，在制订或修订流程中，编辑器的只读模式：预览、导出、搜索、批注、收藏、关键词 */
function getFlowContextmenu(editor) {
  const res = []
  const selectionNode = editor.selection.getNode()
  const isContenteditable = editor.dom.is(selectionNode, '[contenteditable=false]')
  const isNoneditable = editor.dom.is(selectionNode, '.noneditable')
  const content = editor.selection.getContent({ format: 'text' })
  const { endContainer } = editor.selection.getRng()
  const dataset = getPageSheetNode(editor)?.dataset

  // 仅在非列项的内容处设置
  const inItemList = editor.dom.getParent(selectionNode, '[data-type="item_list"]')
  if (inItemList) {
    console.debug('---列项仅支持纯文本,不支持索引和关键词设置---')
  }
  if (editable(dataset) && !inItemList && selectionNode.nodeName !== "SPAN" && endContainer.nodeType === 3 && content) {
    res.push('contextmenu_keyword')
  }
  if (
    (!isContenteditable || !isNoneditable) &&
    (
      editor.dom.getParent(selectionNode, 'div[data-type="figure"]') ||
      editor.dom.getParent(selectionNode, 'div.formula') ||
      editor.dom.getParent(selectionNode, 'table[data-type="table"]')
    )
  ) {
    // 图结构化、公式、表格的收藏
    res.push('contextmenu_collect')
  }

  return res
}
